加密与解密 第一篇 基础篇
第一章 基础知识
1.1 文本字符
1.1.1 字节存储顺序
- Little-Encoding :Intel体系芯片
高字节存入低地址,低字节存入高地址
- Big-Encoding:RSIC架构CPU
高字节存入高地址,低字节存入低地址
1.1.2 ASCII与UNICODE编码
- ASCII
ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 |
---|---|---|---|---|---|---|---|
0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
1 | SOH | 33 | ! | 65 | A | 97 | a |
2 | STX | 34 | " | 66 | B | 98 | b |
3 | ETX | 35 | # | 67 | C | 99 | c |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | E | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | , | 71 | G | 103 | g |
8 | BS | 40 | ( | 72 | H | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | K | 107 | k |
12 | FF | 44 | , | 76 | L | 108 | l |
13 | CR | 45 | - | 77 | M | 109 | m |
14 | SO | 46 | . | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | O | 111 | o |
16 | DLE | 48 | 0 | 80 | P | 112 | p |
17 | DCI | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | S | 115 | s |
20 | DC4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | TB | 55 | 7 | 87 | W | 119 | w |
24 | CAN | 56 | 8 | 88 | X | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | y |
26 | SUB | 58 | : | 90 | Z | 122 | z |
27 | ESC | 59 | ; | 91 | [ | 123 | { |
28 | FS | 60 | < | 92 | / | 124 | | |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | ^ | 126 | ` |
31 | US | 63 | ? | 95 | _ | 127 | DEL |
- unicode
所有字符都是16位
1.2 操作系统
1.2.1 win api
-
动态链接库
-
Kernel
核心功能
- 进程线程
- 内存管理
- 文件访问
-
User
用户接口
- 键盘和鼠标输入
- 窗口和菜单管理
-
GDI
图形设备接口
- 屏幕和打印机显示文本和图像
1.2.2 常用win32 api 函数
hmemcpy
-
这是一个Win16 API函数,位于位的KRNL386.EXE链接库里。是系统底层的东西,没有特殊需要,一般不直接调用
-
功能:执行的操作很简单,只是将内存中的一块数据COPY到另一个地方
-
在Windows 9x中,Win32函数调用通过转换层转换为Win16函数调用,所以Windows 9x底层频繁的调用hmemcpy这个位的函数来拷贝数据
-
它经常被解密者作为断点拦截数据,别称“万能断点”
c
void hmemcpy(
void _huge *hpvDest, //目地数据地址
const void _huge *hpvSource, //源数据地址
long cbCopyn //数据大小
);
GetWindowText
-
此函数在USER32.DLL用户模块中,它的作用是取得一个窗体的标题文字,或者一个文本控件的内容
-
如果成功返回文本长度;失败则返回零值
-
ANSI版是GetWindowTextA Unicode版是GetWindowTextW
```c int GetWindowText( HWND hWnd, //窗口或文件空间句柄 LPTSTR lpString, //缓冲区地址 int nMaxCount //复制的最大字符数 );
```
GetDlgItem
- 此函数在USER32.DLL用户模块中,它的作用是获取指定对话框的句柄
- 如果成功返回对话框的句柄;失败则返回零
HWND GetDlgItem(
HWND hDlg, //对话框句柄
int nIDDlgItem //控件标识
);
GetDlgItemText
- 此函数在USER32.DLL用户模块中,它的作用是获取对话框文本
- 如果成功返回文本长度;失败则返回零
- ANSI版是GetDlgItemTextA Unicode版是GetDlgItemTextW
UINT GetDlgItemText(
HWND hDlg, //对话框句柄
int nIDDlgItem, //空间标识(ID号)
LPTSTR lpString, //文本缓冲区指针
int nMaxCount //字符缓冲区的长度
);
GetDlgItemInt
- 此函数在USER32.DLL用户模块中,它的作用是获取对话框整数值
- 如果成功,lpTranslated被设置为TRUE
UINT GetDlgItemInt(
HWND hDlg, //对话框句柄
int nIDDlgItem, //空间标识
BOOL *lpTranslated, //接受成功/失败指示的指针
BOOL bSigned //指定是有符号数还是无符号数
)
MessageBox
- 此函数在USER32.DLL用户模块中,创建和显示信息框
- ANSI版是MessageBoxA Unicode版是MessageBoxW
int MessageBox(
HWND hDlg, //父窗口句柄
LPCTSTR lpText, //消息框文本地址
LPCTSTR lpCaption, //消息框标题地址
UINT uType //消息框样式
);
GetDlgItemText
- 是根据控件ID来取文字,GetWindowText是根据控件句柄或者指针来取
1.2.3 什么是句柄
- windows标识
- 由应用程序建立或使用的对象所使用的唯一的整数值(32位)
1.2.4 windows 9.x 和unicode
- 大部分的32位函数只是调用了16位版本
- 有少量的unicode版本的函数
- MessageBox
- 大部分的函数只有unicode的参数进入点,但其实并不将unicode码转成ascii,而是直接返回失败的消息
1.2.5 windows NT/2000/XP 与unicode
- 内核只使用unicode
1.2.6 windows消息机制
-
windows应用程序之间、应用程序与windows系统之间的进行通信的手段
-
两个队列
-
系统消息队列
- 应用程序消息队列
按消息到达的先后进行处理
-
常用windows消息函数
-
SendMessage
将一条消息发送给某个函数
- 返回值
- WM_COMMAND
- 用户从菜单或者按钮选择一条命令或者一个控件,发送给其父窗口
- 或者一个快捷键被释放时
- 应用程序处理这条消息,则返回0
- WM_DESTORY
- 一个窗口被破坏时发送
- WM_GETTEXT
- 将程序提供的文本拷贝到一个呼叫程序提供的缓冲区
- WM_QUIT
- 当应用程序调用PostQuitMessage函数
- WM_LEFTBUTTONDOWN
- 光标在一个窗口的客户区,用户按下了鼠标左键
- 未被捕获,就发送给光标下的窗口
1.3 保护模式
- 模式
- 实模式
- 保护模式
- 虚拟x86模式
1.3.1 虚拟内存
- 实模式
- 寻址方式:段基址+段偏移
- 段大小:64K
- 所有段可读写,只有代码段可执行
- 保护模式
- 段选择子+段偏移
- 段选择子:不参与选址,只是GDT或者LDT的指针
- 不同的段寄存器有不同的属性
- 读
- 写
- 执行
- 特选级
- win32平坦内存模式
- 每个进程有自己的虚拟空间,32位进程位4GB
- 程序的代码不区分代码段和数据段
- 4GB中,2GB给应用程序(也可达到3G),2GB给操作系统
- 操作系统和系统DLL所有时间片都必须映射
- 用户exe只在属于自己的时间片映射
- 用户DLL有选择的映射
- 虚拟内存的实现方法:
- 程序启动,分配2GB虚拟地址
- 应用程序代码映射到虚拟内存某个位置
- 使用了DLL,则也映射该DLL
- 数据、堆栈等也进行映射
- 程序从虚拟地址执行
1.3.2 保护模式的权限级别
- 权限级别
4个等级:0,1,2,3
-
0级
-
执行所有指令、访问所有数据
- 操作系统核心层运行在0级
- hal.dll(硬件抽象层)
-
ntoskrnl.exe的上层
-
3级
-
指令有限、数据有限
-
win32子系统运行在3级
- kernel.dll
- user32.dll
- gdi32.dll
-
ntdll.dll
用户层导出并且可以调用的函数接口
-
用户的应用程序
1.4 PE格式
区块
- .txt 全部指令代码
- .rdata 运行期的只读数据
- .data 初始化数据块
- .idata 其他外来DLL的函数和数据,输入表
- .rsrc 模块的全部资源:图标、菜单、位图
- 磁盘文件和内存中的结构一致
相关名词
- 入口点
程序执行时第一行代码的位置
- 文件偏移地址
文件在磁盘上时,各数据的地址
-
虚拟地址
-
内存偏移地址
-
格式:段:偏移量(e.g 0167:00401000)
- cs段选择器,段选择子:0167
- 虚拟地址:00401000
-
基地址 Image Base
-
文件执行时被映射到指定内存的地址
- 有pe文件决定
- vc++建立的exe
- exe基地址:0040000h
- dll基地址: 1000000h